// This is a TextMate grammar distributed by `starry-night`.
// This grammar is developed at
// <https://github.com/microsoft/typespec>
// and licensed `mit`.
// See <https://github.com/wooorm/starry-night> for more info.
/**
 * @import {Grammar} from '@wooorm/starry-night'
 */

/** @type {Grammar} */
const grammar = {
  extensions: ['.tsp'],
  names: ['typespec', 'tsp'],
  patterns: [{include: '#statement'}],
  repository: {
    'alias-id': {
      begin: '(=)\\s*',
      beginCaptures: {1: {name: 'keyword.operator.assignment.tsp'}},
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.alias-id.typespec',
      patterns: [{include: '#expression'}]
    },
    'alias-statement': {
      begin:
        '\\b(alias)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.type.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.alias-statement.typespec',
      patterns: [{include: '#alias-id'}, {include: '#type-parameters'}]
    },
    'augment-decorator-statement': {
      begin: '((@@)\\b[_$[:alpha:]](?:[_$[:alnum:]]|\\.[_$[:alpha:]])*\\b)',
      beginCaptures: {
        1: {name: 'entity.name.tag.tsp'},
        2: {name: 'entity.name.tag.tsp'}
      },
      end: '(?=([_$[:alpha:]]|`))|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.augment-decorator-statement.typespec',
      patterns: [{include: '#token'}, {include: '#parenthesized-expression'}]
    },
    'block-comment': {begin: '/\\*', end: '\\*/', name: 'comment.block.tsp'},
    'boolean-literal': {
      match: '\\b(true|false)\\b',
      name: 'constant.language.tsp'
    },
    callExpression: {
      begin:
        '(\\b[_$[:alpha:]](?:[_$[:alnum:]]|\\.[_$[:alpha:]])*\\b)\\s*(\\()',
      beginCaptures: {
        1: {name: 'entity.name.function.tsp'},
        2: {name: 'punctuation.parenthesis.open.tsp'}
      },
      end: '\\)',
      endCaptures: {0: {name: 'punctuation.parenthesis.close.tsp'}},
      name: 'meta.callExpression.typespec',
      patterns: [
        {include: '#token'},
        {include: '#expression'},
        {include: '#punctuation-comma'}
      ]
    },
    'const-statement': {
      begin:
        '\\b(const)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'variable.name.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.const-statement.typespec',
      patterns: [
        {include: '#type-annotation'},
        {include: '#operator-assignment'},
        {include: '#expression'}
      ]
    },
    decorator: {
      begin: '((@)\\b[_$[:alpha:]](?:[_$[:alnum:]]|\\.[_$[:alpha:]])*\\b)',
      beginCaptures: {
        1: {name: 'entity.name.tag.tsp'},
        2: {name: 'entity.name.tag.tsp'}
      },
      end: '(?=([_$[:alpha:]]|`))|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.decorator.typespec',
      patterns: [{include: '#token'}, {include: '#parenthesized-expression'}]
    },
    'decorator-declaration-statement': {
      begin:
        '(?:(extern)\\s+)?\\b(dec)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'keyword.other.tsp'},
        3: {name: 'entity.name.function.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.decorator-declaration-statement.typespec',
      patterns: [{include: '#token'}, {include: '#operation-parameters'}]
    },
    directive: {
      begin: '\\s*(#\\b[_$[:alpha:]][_$[:alnum:]]*\\b)',
      beginCaptures: {1: {name: 'keyword.directive.name.tsp'}},
      end: '$|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.directive.typespec',
      patterns: [
        {include: '#string-literal'},
        {include: '#identifier-expression'}
      ]
    },
    'doc-comment': {
      begin: '/\\*\\*',
      beginCaptures: {0: {name: 'comment.block.tsp'}},
      end: '\\*/',
      endCaptures: {0: {name: 'comment.block.tsp'}},
      name: 'comment.block.tsp',
      patterns: [{include: '#doc-comment-block'}]
    },
    'doc-comment-block': {
      patterns: [
        {include: '#doc-comment-param'},
        {include: '#doc-comment-return-tag'},
        {include: '#doc-comment-unknown-tag'}
      ]
    },
    'doc-comment-param': {
      captures: {
        1: {name: 'keyword.tag.tspdoc'},
        2: {name: 'keyword.tag.tspdoc'},
        3: {name: 'variable.name.tsp'}
      },
      match:
        '(?x)((@)(?:param|template|prop))\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\b',
      name: 'comment.block.tsp'
    },
    'doc-comment-return-tag': {
      captures: {
        1: {name: 'keyword.tag.tspdoc'},
        2: {name: 'keyword.tag.tspdoc'}
      },
      match: '(?x)((@)(?:returns))\\b',
      name: 'comment.block.tsp'
    },
    'doc-comment-unknown-tag': {
      captures: {
        1: {name: 'entity.name.tag.tsp'},
        2: {name: 'entity.name.tag.tsp'}
      },
      match:
        '(?x)((@)(?:\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`))\\b',
      name: 'comment.block.tsp'
    },
    'enum-body': {
      begin: '\\{',
      beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.enum-body.typespec',
      patterns: [
        {include: '#enum-member'},
        {include: '#token'},
        {include: '#directive'},
        {include: '#decorator'},
        {include: '#punctuation-comma'}
      ]
    },
    'enum-member': {
      begin:
        '(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(:?))',
      beginCaptures: {
        1: {name: 'variable.name.tsp'},
        2: {name: 'keyword.operator.type.annotation.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.enum-member.typespec',
      patterns: [{include: '#token'}, {include: '#type-annotation'}]
    },
    'enum-statement': {
      begin:
        '\\b(enum)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.type.tsp'}
      },
      end: '(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.enum-statement.typespec',
      patterns: [{include: '#token'}, {include: '#enum-body'}]
    },
    'escape-character': {match: '\\\\.', name: 'constant.character.escape.tsp'},
    expression: {
      patterns: [
        {include: '#token'},
        {include: '#directive'},
        {include: '#parenthesized-expression'},
        {include: '#valueof'},
        {include: '#typeof'},
        {include: '#type-arguments'},
        {include: '#object-literal'},
        {include: '#tuple-literal'},
        {include: '#tuple-expression'},
        {include: '#model-expression'},
        {include: '#callExpression'},
        {include: '#identifier-expression'}
      ]
    },
    'function-declaration-statement': {
      begin:
        '(?:(extern)\\s+)?\\b(fn)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'keyword.other.tsp'},
        3: {name: 'entity.name.function.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.function-declaration-statement.typespec',
      patterns: [
        {include: '#token'},
        {include: '#operation-parameters'},
        {include: '#type-annotation'}
      ]
    },
    'identifier-expression': {
      match: '\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`',
      name: 'entity.name.type.tsp'
    },
    'import-statement': {
      begin: '\\b(import)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.import-statement.typespec',
      patterns: [{include: '#token'}]
    },
    'interface-body': {
      begin: '\\{',
      beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.interface-body.typespec',
      patterns: [
        {include: '#token'},
        {include: '#directive'},
        {include: '#decorator'},
        {include: '#interface-member'},
        {include: '#punctuation-semicolon'}
      ]
    },
    'interface-heritage': {
      begin: '\\b(extends)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '((?=\\{)|(?=;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))',
      name: 'meta.interface-heritage.typespec',
      patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
    },
    'interface-member': {
      begin:
        '(?:\\b(op)\\b\\s+)?(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.function.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.interface-member.typespec',
      patterns: [{include: '#token'}, {include: '#operation-signature'}]
    },
    'interface-statement': {
      begin: '\\b(interface)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.interface-statement.typespec',
      patterns: [
        {include: '#token'},
        {include: '#type-parameters'},
        {include: '#interface-heritage'},
        {include: '#interface-body'},
        {include: '#expression'}
      ]
    },
    'line-comment': {match: '//.*$', name: 'comment.line.double-slash.tsp'},
    'model-expression': {
      begin: '\\{',
      beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.model-expression.typespec',
      patterns: [
        {include: '#model-property'},
        {include: '#token'},
        {include: '#directive'},
        {include: '#decorator'},
        {include: '#spread-operator'},
        {include: '#punctuation-semicolon'}
      ]
    },
    'model-heritage': {
      begin: '\\b(extends|is)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '((?=\\{)|(?=;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))',
      name: 'meta.model-heritage.typespec',
      patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
    },
    'model-property': {
      begin:
        '(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)|(\\"(?:[^\\"\\\\]|\\\\.)*\\"))',
      beginCaptures: {
        1: {name: 'variable.name.tsp'},
        2: {name: 'string.quoted.double.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.model-property.typespec',
      patterns: [
        {include: '#token'},
        {include: '#type-annotation'},
        {include: '#operator-assignment'},
        {include: '#expression'}
      ]
    },
    'model-statement': {
      begin: '\\b(model)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.model-statement.typespec',
      patterns: [
        {include: '#token'},
        {include: '#type-parameters'},
        {include: '#model-heritage'},
        {include: '#expression'}
      ]
    },
    'namespace-body': {
      begin: '\\{',
      beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.namespace-body.typespec',
      patterns: [{include: '#statement'}]
    },
    'namespace-name': {
      begin: '(?=([_$[:alpha:]]|`))',
      end: '((?=\\{)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))',
      name: 'meta.namespace-name.typespec',
      patterns: [
        {include: '#identifier-expression'},
        {include: '#punctuation-accessor'}
      ]
    },
    'namespace-statement': {
      begin: '\\b(namespace)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '((?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b))',
      name: 'meta.namespace-statement.typespec',
      patterns: [
        {include: '#token'},
        {include: '#namespace-name'},
        {include: '#namespace-body'}
      ]
    },
    'numeric-literal': {
      match:
        '(?:\\b(?<!\\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\\b(?!\\$)|\\b(?<!\\$)0(?:b|B)[01][01_]*(n)?\\b(?!\\$)|(?<!\\$)(?:(?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(\\.)[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\B(\\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(\\.)(n)?\\B)|(?:\\B(\\.)[0-9][0-9_]*(n)?\\b)|(?:\\b[0-9][0-9_]*(n)?\\b(?!\\.)))(?!\\$))',
      name: 'constant.numeric.tsp'
    },
    'object-literal': {
      begin: '#\\{',
      beginCaptures: {0: {name: 'punctuation.hashcurlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.object-literal.typespec',
      patterns: [
        {include: '#token'},
        {include: '#object-literal-property'},
        {include: '#directive'},
        {include: '#spread-operator'},
        {include: '#punctuation-comma'}
      ]
    },
    'object-literal-property': {
      begin:
        '(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(:))',
      beginCaptures: {
        1: {name: 'variable.name.tsp'},
        2: {name: 'keyword.operator.type.annotation.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.object-literal-property.typespec',
      patterns: [{include: '#token'}, {include: '#expression'}]
    },
    'operation-heritage': {
      begin: '\\b(is)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.operation-heritage.typespec',
      patterns: [{include: '#expression'}]
    },
    'operation-parameters': {
      begin: '\\(',
      beginCaptures: {0: {name: 'punctuation.parenthesis.open.tsp'}},
      end: '\\)',
      endCaptures: {0: {name: 'punctuation.parenthesis.close.tsp'}},
      name: 'meta.operation-parameters.typespec',
      patterns: [
        {include: '#token'},
        {include: '#decorator'},
        {include: '#model-property'},
        {include: '#spread-operator'},
        {include: '#punctuation-comma'}
      ]
    },
    'operation-signature': {
      patterns: [
        {include: '#type-parameters'},
        {include: '#operation-heritage'},
        {include: '#operation-parameters'},
        {include: '#type-annotation'}
      ]
    },
    'operation-statement': {
      begin:
        '\\b(op)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.function.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.operation-statement.typespec',
      patterns: [{include: '#token'}, {include: '#operation-signature'}]
    },
    'operator-assignment': {
      match: '=',
      name: 'keyword.operator.assignment.tsp'
    },
    'parenthesized-expression': {
      begin: '\\(',
      beginCaptures: {0: {name: 'punctuation.parenthesis.open.tsp'}},
      end: '\\)',
      endCaptures: {0: {name: 'punctuation.parenthesis.close.tsp'}},
      name: 'meta.parenthesized-expression.typespec',
      patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
    },
    'punctuation-accessor': {match: '\\.', name: 'punctuation.accessor.tsp'},
    'punctuation-comma': {match: ',', name: 'punctuation.comma.tsp'},
    'punctuation-semicolon': {
      match: ';',
      name: 'punctuation.terminator.statement.tsp'
    },
    'scalar-body': {
      begin: '\\{',
      beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.scalar-body.typespec',
      patterns: [
        {include: '#token'},
        {include: '#directive'},
        {include: '#scalar-constructor'},
        {include: '#punctuation-semicolon'}
      ]
    },
    'scalar-constructor': {
      begin:
        '\\b(init)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.function.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.scalar-constructor.typespec',
      patterns: [{include: '#token'}, {include: '#operation-parameters'}]
    },
    'scalar-extends': {
      begin: '\\b(extends)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?=;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.scalar-extends.typespec',
      patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
    },
    'scalar-statement': {
      begin:
        '\\b(scalar)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.type.tsp'}
      },
      end: '(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.scalar-statement.typespec',
      patterns: [
        {include: '#token'},
        {include: '#type-parameters'},
        {include: '#scalar-extends'},
        {include: '#scalar-body'}
      ]
    },
    'spread-operator': {
      begin: '\\.\\.\\.',
      beginCaptures: {0: {name: 'keyword.operator.spread.tsp'}},
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.spread-operator.typespec',
      patterns: [{include: '#expression'}]
    },
    statement: {
      patterns: [
        {include: '#token'},
        {include: '#directive'},
        {include: '#augment-decorator-statement'},
        {include: '#decorator'},
        {include: '#model-statement'},
        {include: '#scalar-statement'},
        {include: '#union-statement'},
        {include: '#interface-statement'},
        {include: '#enum-statement'},
        {include: '#alias-statement'},
        {include: '#const-statement'},
        {include: '#namespace-statement'},
        {include: '#operation-statement'},
        {include: '#import-statement'},
        {include: '#using-statement'},
        {include: '#decorator-declaration-statement'},
        {include: '#function-declaration-statement'},
        {include: '#punctuation-semicolon'}
      ]
    },
    'string-literal': {
      begin: '"',
      end: '"|$',
      name: 'string.quoted.double.tsp',
      patterns: [
        {include: '#template-expression'},
        {include: '#escape-character'}
      ]
    },
    'template-expression': {
      begin: '\\$\\{',
      beginCaptures: {
        0: {name: 'punctuation.definition.template-expression.begin.tsp'}
      },
      end: '\\}',
      endCaptures: {
        0: {name: 'punctuation.definition.template-expression.end.tsp'}
      },
      name: 'meta.template-expression.typespec',
      patterns: [{include: '#expression'}]
    },
    token: {
      patterns: [
        {include: '#doc-comment'},
        {include: '#line-comment'},
        {include: '#block-comment'},
        {include: '#triple-quoted-string-literal'},
        {include: '#string-literal'},
        {include: '#boolean-literal'},
        {include: '#numeric-literal'}
      ]
    },
    'triple-quoted-string-literal': {
      begin: '"""',
      end: '"""',
      name: 'string.quoted.triple.tsp',
      patterns: [
        {include: '#template-expression'},
        {include: '#escape-character'}
      ]
    },
    'tuple-expression': {
      begin: '\\[',
      beginCaptures: {0: {name: 'punctuation.squarebracket.open.tsp'}},
      end: '\\]',
      endCaptures: {0: {name: 'punctuation.squarebracket.close.tsp'}},
      name: 'meta.tuple-expression.typespec',
      patterns: [{include: '#expression'}]
    },
    'tuple-literal': {
      begin: '#\\[',
      beginCaptures: {0: {name: 'punctuation.hashsquarebracket.open.tsp'}},
      end: '\\]',
      endCaptures: {0: {name: 'punctuation.squarebracket.close.tsp'}},
      name: 'meta.tuple-literal.typespec',
      patterns: [{include: '#expression'}, {include: '#punctuation-comma'}]
    },
    'type-annotation': {
      begin: '\\s*(\\??)\\s*(:)',
      beginCaptures: {
        1: {name: 'keyword.operator.optional.tsp'},
        2: {name: 'keyword.operator.type.annotation.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|=|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.type-annotation.typespec',
      patterns: [{include: '#expression'}]
    },
    'type-argument': {
      begin:
        '(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(=))',
      beginCaptures: {
        1: {name: 'entity.name.type.tsp'},
        2: {name: 'keyword.operator.assignment.tsp'}
      },
      end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      endCaptures: {0: {name: 'keyword.operator.assignment.tsp'}},
      name: 'meta.type-argument.typespec',
      patterns: [
        {include: '#token'},
        {include: '#expression'},
        {include: '#punctuation-comma'}
      ]
    },
    'type-arguments': {
      begin: '<',
      beginCaptures: {
        0: {name: 'punctuation.definition.typeparameters.begin.tsp'}
      },
      end: '>',
      endCaptures: {0: {name: 'punctuation.definition.typeparameters.end.tsp'}},
      name: 'meta.type-arguments.typespec',
      patterns: [
        {include: '#type-argument'},
        {include: '#expression'},
        {include: '#punctuation-comma'}
      ]
    },
    'type-parameter': {
      begin: '(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {1: {name: 'entity.name.type.tsp'}},
      end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.type-parameter.typespec',
      patterns: [
        {include: '#token'},
        {include: '#type-parameter-constraint'},
        {include: '#type-parameter-default'}
      ]
    },
    'type-parameter-constraint': {
      begin: 'extends',
      beginCaptures: {0: {name: 'keyword.other.tsp'}},
      end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.type-parameter-constraint.typespec',
      patterns: [{include: '#expression'}]
    },
    'type-parameter-default': {
      begin: '=',
      beginCaptures: {0: {name: 'keyword.operator.assignment.tsp'}},
      end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.type-parameter-default.typespec',
      patterns: [{include: '#expression'}]
    },
    'type-parameters': {
      begin: '<',
      beginCaptures: {
        0: {name: 'punctuation.definition.typeparameters.begin.tsp'}
      },
      end: '>',
      endCaptures: {0: {name: 'punctuation.definition.typeparameters.end.tsp'}},
      name: 'meta.type-parameters.typespec',
      patterns: [{include: '#type-parameter'}, {include: '#punctuation-comma'}]
    },
    typeof: {
      begin: '\\b(typeof)',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.typeof.typespec',
      patterns: [{include: '#expression'}]
    },
    'union-body': {
      begin: '\\{',
      beginCaptures: {0: {name: 'punctuation.curlybrace.open.tsp'}},
      end: '\\}',
      endCaptures: {0: {name: 'punctuation.curlybrace.close.tsp'}},
      name: 'meta.union-body.typespec',
      patterns: [
        {include: '#union-variant'},
        {include: '#token'},
        {include: '#directive'},
        {include: '#decorator'},
        {include: '#expression'},
        {include: '#punctuation-comma'}
      ]
    },
    'union-statement': {
      begin:
        '\\b(union)\\b\\s+(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)',
      beginCaptures: {
        1: {name: 'keyword.other.tsp'},
        2: {name: 'entity.name.type.tsp'}
      },
      end: '(?<=\\})|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.union-statement.typespec',
      patterns: [{include: '#token'}, {include: '#union-body'}]
    },
    'union-variant': {
      begin:
        '(?:(\\b[_$[:alpha:]][_$[:alnum:]]*\\b|`(?:[^`\\\\]|\\\\.)*`)\\s*(:))',
      beginCaptures: {
        1: {name: 'variable.name.tsp'},
        2: {name: 'keyword.operator.type.annotation.tsp'}
      },
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.union-variant.typespec',
      patterns: [{include: '#token'}, {include: '#expression'}]
    },
    'using-statement': {
      begin: '\\b(using)\\b',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.using-statement.typespec',
      patterns: [
        {include: '#token'},
        {include: '#identifier-expression'},
        {include: '#punctuation-accessor'}
      ]
    },
    valueof: {
      begin: '\\b(valueof)',
      beginCaptures: {1: {name: 'keyword.other.tsp'}},
      end: '(?=>)|(?=,|;|@|\\)|\\}|\\b(?:extern)\\b|\\b(?:namespace|model|op|using|import|enum|alias|union|interface|dec|fn)\\b)',
      name: 'meta.valueof.typespec',
      patterns: [{include: '#expression'}]
    }
  },
  scopeName: 'source.tsp'
}

export default grammar
